﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

using OpGen.Extensions.Security;
using OpGen.Extensions.Network;

namespace OpGen.Extensions.Runtime.Server
{
    public abstract class ServerMessageHandler<TClient> 
    {
        private Dictionary<int, IServerMessageTargetContainer<TClient>> _opCodes = new Dictionary<int, IServerMessageTargetContainer<TClient>>();

        /// <summary>
        /// Registriert ein Methodenziel für die eigehende Nachricht
        /// </summary>
        /// <typeparam name="TMessage">Type der Nachricht die Registriert werden soll</typeparam>
        /// <param name="opCode">Der OpCode der die Nachricht beschreibt</param>
        /// <param name="target">Das Methodenziel</param>
        public void RegisterMessage<TMessage>(int opCode, ServerMessageTargetDelegate<TMessage, TClient> target)
        {
            RegisterMessage(opCode, target, MethodAuthenticationTypes.Always);
        }

        /// <summary>
        /// Registriert ein Methodenziel für die eigehende Nachricht
        /// </summary>
        /// <typeparam name="TMessage">Type der Nachricht die Registriert werden soll</typeparam>
        /// <param name="opCode">Der OpCode der die Nachricht beschreibt</param>
        /// <param name="target">Das Methodenziel</param>
        /// <param name="authentication">Gibt an wann die Nachricht ausgelöst werden soll</param>
        public void RegisterMessage<TMessage>(int opCode, ServerMessageTargetDelegate<TMessage, TClient> target, MethodAuthenticationTypes authentication)
        {
            var newContainer = new ServerMessageTargetContainer<TMessage, TClient>(target, opCode,authentication);
            _opCodes.Add(opCode, newContainer);
        }
        
        protected IServerMessageTargetContainer<TClient> GetTarget(int opCode)
        {
            if (_opCodes.ContainsKey(opCode))
                return _opCodes[opCode];

            return null;
        }
    }
}
